// 测试信号量的 P 和 V 操作的线程协调

#include <gtest/gtest.h>
#include <semaphore.h>
#include <thread>
#include <vector>
#include <atomic>

std::counting_semaphore<5> sem(2); // 初始资源计数为2

void task(int id, std::atomic<int>& completed) {
    sem.acquire();  // P操作
    std::this_thread::sleep_for(std::chrono::milliseconds(200)); // 模拟工作
    completed.fetch_add(1);  // 记录完成任务的线程
    sem.release();  // V操作
}

TEST(SemaphoreTest, PVOperation) {
    std::atomic<int> completed(0);
    const int num_threads = 5;

    std::vector<std::thread> threads;
    for (int i = 0; i < num_threads; ++i) {
        threads.emplace_back(task, i, std::ref(completed));
    }

    for (auto& t : threads) t.join();

    EXPECT_EQ(completed.load(), num_threads);
}